/*************************************************************************
    > File Name: F.implement_ps_aux_grep_bash.c
    > Author: Ykk
    > Mail: 3393579535@qq.com 
    > Created Time: 2023年05月05日 星期五 22时02分49秒
 ************************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main() {
    int pipes[2];
    pid_t pid1, pid2;

    // 创建管道
    if (pipe(pipes) < 0) {
        perror("pipe error");
        return -1;
    }

    // 创建子进程1
    pid1 = fork();
    if (pid1 == 0) {
        // 子进程1，关闭读端，将管道的写端复制到标准输出
        close(pipes[0]);
        dup2(pipes[1], STDOUT_FILENO);
        // 执行ps aux命令
        execl("/bin/ps", "ps", "aux", NULL);
    } else if (pid1 > 0) {
        // 创建子进程2
        pid2 = fork();
        if (pid2 == 0) {
            // 子进程2，关闭写端，将管道的读端复制到标准输入
            close(pipes[1]);
            dup2(pipes[0], STDIN_FILENO);
            // 执行grep "bash"命令
            execl("/bin/grep", "grep", "bash", NULL);
        } else if (pid2 > 0) {
            // 父进程，关闭管道两端
            close(pipes[0]);
            close(pipes[1]);
            // 等待子进程结束
            waitpid(pid1, NULL, 0);
            waitpid(pid2, NULL, 0);
        } else {
            perror("fork error");
            return -1;
        }
    } else {
        perror("fork error");
        return -1;
    }

    return 0;
}
